import numpy as np
import pandas as pd
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
import plotly.io as pio
pio.renderers
Renderers configuration
-----------------------
Default renderer: 'plotly_mimetype+notebook'
Available renderers:
['plotly_mimetype', 'jupyterlab', 'nteract', 'vscode',
'notebook', 'notebook_connected', 'kaggle', 'azure', 'colab',
'cocalc', 'databricks', 'json', 'png', 'jpeg', 'jpg', 'svg',
'pdf', 'browser', 'firefox', 'chrome', 'chromium', 'iframe',
'iframe_connected', 'sphinx_gallery', 'sphinx_gallery_png']
pio.renderers.default = "notebook"
def equivalencia_linha(tabulacao_cruzada):
"""Essa função determina as esquivalências por linha entre dois mapas de uso e cobertura da terra (UTC).
Recebe como entrada uma matriz de tablução cruzada entre os dois mapas.
"""
mapeamento_linha = []
for index, row in tabulacao_cruzada.iterrows():
max_row = row.sort_values(ascending=False)
mapeamento_linha.append(tabulacao_cruzada.loc[: , max_row.index[0]])
mapeamento_linha = pd.DataFrame(data=mapeamento_linha)
linhas = mapeamento_linha.index.tolist()
colunas = mapeamento_linha.columns.tolist()
data_tuples = list(zip(colunas, linhas))
mapeamento_linha = pd.DataFrame(data_tuples, columns=['Quarto_Inventario','MapBiomas'])
for i in range(len(mapeamento_linha)):
mapeamento_linha.loc[i, "Size"] = tabulacao_cruzada.loc[(mapeamento_linha["Quarto_Inventario"][i])].max()
return mapeamento_linha
def equivalencia_coluna(tabulacao_cruzada):
"""Essa função determina as esquivalências por coluna entre dois mapas de uso e cobertura da terra (UTC).
Recebe como entrada uma matriz de tablução cruzada entre os dois mapas.
"""
mapeamento_coluna = []
for column in range(0, tabulacao_cruzada.shape[1]):
max_column = tabulacao_cruzada.iloc[:, column].sort_values(ascending=False)
mapeamento_coluna.append(tabulacao_cruzada.loc[max_column.index[0], :])
mapeamento_coluna = pd.DataFrame(data=mapeamento_coluna)
linhas = mapeamento_coluna.index.tolist()
colunas = mapeamento_coluna.columns.tolist()
data_tuples = list(zip(colunas, linhas))
mapeamento_coluna = pd.DataFrame(data_tuples, columns=['MapBiomas', 'Quarto_Inventario'])
mapeamento_coluna.loc[:, ("Size")] = 0
for i in range(len(mapeamento_coluna)):
mapeamento_coluna.loc[i, "Size"] = tabulacao_cruzada.loc[:, (mapeamento_coluna["MapBiomas"][i])].max()
return mapeamento_coluna
def legenda_harmonizada(mapeamento_linha, mapeamento_coluna):
"""
Determina a harmonização das legendas a partir das harmonizações por linha e por coluna.
"""
legenda = pd.merge(equivalencias_linha, equivalencias_coluna, how="outer")
return legenda
def nodify(node_names):
'''
Cria os nódulos para agrupar cada legendas em uma coluna a partir da legenda gerada
pela função harmonizacao_2_sankey e geras as cores de cada nódulo por coluna.
'''
# uniqe name endings
ends = sorted(list(set([e[-1] for e in node_names])))
# intervals
steps = 0
# x-values for each unique name ending
# for input as node position
nodes_x = {}
node_colors = {}
xVal = 0
for e in ends:
if e != " ":
nodes_x[str(e)] = xVal
xVal += steps + 0.3
else:
nodes_x[str(e)] = xVal
xVal += steps
for e in ends:
if e != "'":
node_colors[str(e)] = '#84caa0'
else:
node_colors[str(e)] = '#37986a'
# x and y values in list form
x_values = [nodes_x[n[-1]] for n in node_names]
y_values = [0.01]*len(x_values)
node_colors = [node_colors[n[-1]] for n in node_names]
return x_values, y_values, node_colors
def df_2_sankey(df,cols,values,hover_value=None):
"""
Helper function to convert a dataframe of relationships to
Plotly Sankey format.
"""
colors = ['#D0EDA6','#EDEF7B','#EF7B84','#00308f','#eedc82','#c66']
out = df.copy()
entities = dict()
vals_ = [values,hover_value]
try:
vals_.remove(None)
except:
pass
# get dict of uid for each entity in each level from 0...n
for n,c in enumerate(cols):
if n == 0:
out[f'{c}_'] = pd.factorize(out[c])[0]
else:
out[f'{c}_'] = pd.factorize(out[c])[0] + (out[f'{cols[n-1]}_'].max()+1)
entities[n] = dict(out[[cols[n]+'_',cols[n]]].values)
# create df edge list between source,targets
edge_list = list()
for i in range(0, len(cols), 1):
slice_ = cols[i:i+2]
if len(slice_)==2:
el_ = out.groupby([f'{c}_' for c in slice_],as_index=False)[vals_].sum()
el_.columns = ['source','target']+vals_
edge_list.append(el_)
edge_list = pd.concat(edge_list,ignore_index=True)
# Sankey node definitions are simply the ordered uid/names of each entity
labels = [v[i] for k,v in entities.items() for i in v] # use v[i] for name, i for uid
node_colors = [colors[k] for k in entities.keys() for i in entities[k]]
# Sankey edge definitions
source = list(edge_list['source'])
target = list(edge_list['target'])
values = list(edge_list[values])
if hover_value is None:
hover_values = list()
else:
hover_values = list(edge_list[hover_value])
if len(source) == len(target) == len(values):
return edge_list,entities,labels,node_colors,source,target,values,hover_values
else:
raise Exception('Output test fail: lists are of unequal lengths')
def harmonizacao_2_sankey(df):
"""
Gera os outputs necessários para gerar o diagrama de Sankey via plotly para a legenda harmonizada.
"""
equivalencias_linha = equivalencia_linha(df)
_df = pd.DataFrame()
_df["source"] = equivalencias_linha["Quarto_Inventario"] + "!"
_df["target"] = equivalencias_linha["MapBiomas"] + "'"
_df["value"] = equivalencias_linha["Size"]
equivalencias_coluna = equivalencia_coluna(df)
_df2 = pd.DataFrame()
_df2["source"] = equivalencias_coluna["MapBiomas"] + "'"
_df2["target"] = equivalencias_coluna["Quarto_Inventario"].astype(str) + " "
_df2["value"] = equivalencias_coluna["Size"]
_df = pd.concat([_df, _df2], ignore_index=True)
legendas = pd.concat([_df['source'], _df['target']])
legendas = legendas.unique()
legenda = {x: index for index, x in enumerate(legendas)}
nodified_x, nodified_y, node_colors = nodify(legendas)
source = []
target = []
value = []
for linha in _df.iterrows():
source.append(legenda.get(linha[1].source))
target.append(legenda.get(linha[1].target))
value.append(linha[1].value)
return legendas, source, target, value, node_colors, nodified_x, nodified_y
mapbiomas_col7_legenda = {
1 : "Floresta",
3 : "Formação Florestal",
4 : "Formação Savânica",
5 : "Mangue",
49 : "Restinga Arborizada",
10 : "Formação Natural não Florestal",
11 : "Campo Alagado e Área Pantanosa",
12 : "Formação Campestre",
32 : "Apicum",
29 : "Afloramento Rochoso",
50 : "Restinga Herbácea",
13 : "Outras Formações não Florestais",
14 : "Agropecuária",
15 : "Pastagem",
18 : "Agricultura",
19 : "Lavoura Temporária",
39 : "Soja",
20 : "Cana",
40 : "Arroz (beta)",
62 : "Algodão (beta)",
41 : "Outras Lavouras Temporárias",
36 : "Lavoura Perene",
46 : "Café",
47 : "Citrus",
48 : "Outras Lavouras Perenes",
9 : "Silvicultura",
21 : "Mosaico de Usos",
22 : "Área não Vegetada",
23 : "Praia, Duna e Areal",
24 : "Área Urbanizada",
30 : "Mineração",
25 : "Outras Áreas não Vegetadas",
26 : "Corpo D'água",
33 : "Rio, Lago e Oceano",
31 : "Aquicultura",
27 : "Não Observado"
}
quarto_inventario_legenda = {
1 : "Floresta manejada (FM)",
2 : "Floresta não manejada (FNM)",
3 : "Floresta secundária (FSec)",
4 : "Corte seletivo (CS)",
5 : "Reflorestamento (Ref)",
6 : "Campo manejado (GM)",
7 : "Campo não manejado (GNM)",
8 : "Campo secundário (GSec)",
9 : "Pastagem (Ap)",
10 : "Pastagem degradada (APD)",
11 : "Outras formações lenhosas manejadas (OFLM)",
12 : "Outras formações lenhosas não manejadas (OFLNM)",
13 : "Outras formações lenhosas secundárias (OFLSec)",
14 : "Agricultura anual (AC)",
15 : "Agricultura perene (PER)",
16 : "Agricultura semiperene (CANA)",
17 : "Água (A)",
18 : "Reservatório (Res)",
19 : "Assentamento (S)",
20 : "Dunas manejadas (DnM)",
21 : "Dunas não manejadas (DnNM)",
22 : "Afloramento rochoso manejado (ArM)",
23 : "Afloramento rochoso não manejado (ArNM)",
24 : "Mineração (Min)",
25 : "Solo exposto (SE)",
26 : "Áreas não observadas (NO)"
}
df = pd.read_csv("../confusion_matrix/tab_cruz_mata_atlantica.csv", index_col="Unnamed: 0")
df.head()
| 0.0 | 3.0 | 4.0 | 5.0 | 9.0 | 11.0 | 12.0 | 13.0 | 15.0 | 20.0 | ... | 39.0 | 40.0 | 41.0 | 46.0 | 47.0 | 48.0 | 49.0 | 50.0 | 62.0 | 255.0 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0.0 | 3617434630 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2166385522 |
| 1.0 | 0 | 51984059 | 473283 | 550262 | 274268 | 2589120 | 132518 | 11203 | 891218 | 19158 | ... | 69524 | 134 | 324559 | 85161 | 6451 | 2818 | 2295872 | 229626 | 0 | 12772 |
| 2.0 | 0 | 215001322 | 17332503 | 1463708 | 5722577 | 6012079 | 2088208 | 36246 | 12652585 | 428910 | ... | 3971244 | 14028 | 2095462 | 1137122 | 14612 | 9313 | 3625678 | 819875 | 0 | 197732 |
| 3.0 | 0 | 4924689 | 1140970 | 1207 | 464453 | 354173 | 147436 | 3365 | 1150465 | 25954 | ... | 148995 | 1793 | 215977 | 65800 | 3043 | 711 | 104670 | 16440 | 0 | 8735 |
| 5.0 | 0 | 15048173 | 558793 | 1184 | 38185602 | 242503 | 775344 | 13158 | 1906725 | 46056 | ... | 418991 | 2480 | 503721 | 251082 | 6551 | 3179 | 113212 | 2371 | 0 | 55266 |
5 rows × 29 columns
df.shape
(25, 29)
df.index
Index([ 0.0, 1.0, 2.0, 3.0, 5.0, 6.0, 7.0, 8.0, 9.0, 11.0, 12.0, 13.0,
14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0,
26.0],
dtype='float64')
df.columns
Index(['0.0', '3.0', '4.0', '5.0', '9.0', '11.0', '12.0', '13.0', '15.0',
'20.0', '21.0', '23.0', '24.0', '25.0', '29.0', '30.0', '31.0', '32.0',
'33.0', '39.0', '40.0', '41.0', '46.0', '47.0', '48.0', '49.0', '50.0',
'62.0', '255.0'],
dtype='object')
df = df.drop(index=0.0, columns=["0.0", "255.0"])
df.head()
| 3.0 | 4.0 | 5.0 | 9.0 | 11.0 | 12.0 | 13.0 | 15.0 | 20.0 | 21.0 | ... | 33.0 | 39.0 | 40.0 | 41.0 | 46.0 | 47.0 | 48.0 | 49.0 | 50.0 | 62.0 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1.0 | 51984059 | 473283 | 550262 | 274268 | 2589120 | 132518 | 11203 | 891218 | 19158 | 4019897 | ... | 193152 | 69524 | 134 | 324559 | 85161 | 6451 | 2818 | 2295872 | 229626 | 0 |
| 2.0 | 215001322 | 17332503 | 1463708 | 5722577 | 6012079 | 2088208 | 36246 | 12652585 | 428910 | 41313425 | ... | 1000978 | 3971244 | 14028 | 2095462 | 1137122 | 14612 | 9313 | 3625678 | 819875 | 0 |
| 3.0 | 4924689 | 1140970 | 1207 | 464453 | 354173 | 147436 | 3365 | 1150465 | 25954 | 3115905 | ... | 33899 | 148995 | 1793 | 215977 | 65800 | 3043 | 711 | 104670 | 16440 | 0 |
| 5.0 | 15048173 | 558793 | 1184 | 38185602 | 242503 | 775344 | 13158 | 1906725 | 46056 | 5883121 | ... | 46229 | 418991 | 2480 | 503721 | 251082 | 6551 | 3179 | 113212 | 2371 | 0 |
| 6.0 | 1168844 | 173823 | 622 | 16555 | 432863 | 1155427 | 115 | 87519 | 133 | 157024 | ... | 3895 | 41060 | 8 | 12071 | 321 | 138 | 18 | 275 | 386 | 0 |
5 rows × 27 columns
classes_mapa1 = df.columns.astype(float)
classes_mapa2 = df.index
# Mapeando os valores de pixels com os nomes das classes
mapa1_legenda = list(map(mapbiomas_col7_legenda.get, classes_mapa1))
mapa2_legenda = list(map(quarto_inventario_legenda.get, classes_mapa2))
mapa1_legenda
['Formação Florestal', 'Formação Savânica', 'Mangue', 'Silvicultura', 'Campo Alagado e Área Pantanosa', 'Formação Campestre', 'Outras Formações não Florestais', 'Pastagem', 'Cana', 'Mosaico de Usos', 'Praia, Duna e Areal', 'Área Urbanizada', 'Outras Áreas não Vegetadas', 'Afloramento Rochoso', 'Mineração', 'Aquicultura', 'Apicum', 'Rio, Lago e Oceano', 'Soja', 'Arroz (beta)', 'Outras Lavouras Temporárias', 'Café', 'Citrus', 'Outras Lavouras Perenes', 'Restinga Arborizada', 'Restinga Herbácea', 'Algodão (beta)']
mapa2_legenda
['Floresta manejada (FM)', 'Floresta não manejada (FNM)', 'Floresta secundária (FSec)', 'Reflorestamento (Ref)', 'Campo manejado (GM)', 'Campo não manejado (GNM)', 'Campo secundário (GSec)', 'Pastagem (Ap)', 'Outras formações lenhosas manejadas (OFLM)', 'Outras formações lenhosas não manejadas (OFLNM)', 'Outras formações lenhosas secundárias (OFLSec)', 'Agricultura anual (AC)', 'Agricultura perene (PER)', 'Agricultura semiperene (CANA)', 'Água (A)', 'Reservatório (Res)', 'Assentamento (S)', 'Dunas manejadas (DnM)', 'Dunas não manejadas (DnNM)', 'Afloramento rochoso manejado (ArM)', 'Afloramento rochoso não manejado (ArNM)', 'Mineração (Min)', 'Solo exposto (SE)', 'Áreas não observadas (NO)']
# Renomeando linhas e colunas de acordo com as classes
df.columns = mapa1_legenda
df.index = mapa2_legenda
df.head()
| Formação Florestal | Formação Savânica | Mangue | Silvicultura | Campo Alagado e Área Pantanosa | Formação Campestre | Outras Formações não Florestais | Pastagem | Cana | Mosaico de Usos | ... | Rio, Lago e Oceano | Soja | Arroz (beta) | Outras Lavouras Temporárias | Café | Citrus | Outras Lavouras Perenes | Restinga Arborizada | Restinga Herbácea | Algodão (beta) | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Floresta manejada (FM) | 51984059 | 473283 | 550262 | 274268 | 2589120 | 132518 | 11203 | 891218 | 19158 | 4019897 | ... | 193152 | 69524 | 134 | 324559 | 85161 | 6451 | 2818 | 2295872 | 229626 | 0 |
| Floresta não manejada (FNM) | 215001322 | 17332503 | 1463708 | 5722577 | 6012079 | 2088208 | 36246 | 12652585 | 428910 | 41313425 | ... | 1000978 | 3971244 | 14028 | 2095462 | 1137122 | 14612 | 9313 | 3625678 | 819875 | 0 |
| Floresta secundária (FSec) | 4924689 | 1140970 | 1207 | 464453 | 354173 | 147436 | 3365 | 1150465 | 25954 | 3115905 | ... | 33899 | 148995 | 1793 | 215977 | 65800 | 3043 | 711 | 104670 | 16440 | 0 |
| Reflorestamento (Ref) | 15048173 | 558793 | 1184 | 38185602 | 242503 | 775344 | 13158 | 1906725 | 46056 | 5883121 | ... | 46229 | 418991 | 2480 | 503721 | 251082 | 6551 | 3179 | 113212 | 2371 | 0 |
| Campo manejado (GM) | 1168844 | 173823 | 622 | 16555 | 432863 | 1155427 | 115 | 87519 | 133 | 157024 | ... | 3895 | 41060 | 8 | 12071 | 321 | 138 | 18 | 275 | 386 | 0 |
5 rows × 27 columns
Convertendo os valores de pixel para milhões de hectares.
df2 = df
df = round(df * 0.09 / 1000000, 2)
df.head()
| Formação Florestal | Formação Savânica | Mangue | Silvicultura | Campo Alagado e Área Pantanosa | Formação Campestre | Outras Formações não Florestais | Pastagem | Cana | Mosaico de Usos | ... | Rio, Lago e Oceano | Soja | Arroz (beta) | Outras Lavouras Temporárias | Café | Citrus | Outras Lavouras Perenes | Restinga Arborizada | Restinga Herbácea | Algodão (beta) | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Floresta manejada (FM) | 4.68 | 0.04 | 0.05 | 0.02 | 0.23 | 0.01 | 0.0 | 0.08 | 0.00 | 0.36 | ... | 0.02 | 0.01 | 0.0 | 0.03 | 0.01 | 0.0 | 0.0 | 0.21 | 0.02 | 0.0 |
| Floresta não manejada (FNM) | 19.35 | 1.56 | 0.13 | 0.52 | 0.54 | 0.19 | 0.0 | 1.14 | 0.04 | 3.72 | ... | 0.09 | 0.36 | 0.0 | 0.19 | 0.10 | 0.0 | 0.0 | 0.33 | 0.07 | 0.0 |
| Floresta secundária (FSec) | 0.44 | 0.10 | 0.00 | 0.04 | 0.03 | 0.01 | 0.0 | 0.10 | 0.00 | 0.28 | ... | 0.00 | 0.01 | 0.0 | 0.02 | 0.01 | 0.0 | 0.0 | 0.01 | 0.00 | 0.0 |
| Reflorestamento (Ref) | 1.35 | 0.05 | 0.00 | 3.44 | 0.02 | 0.07 | 0.0 | 0.17 | 0.00 | 0.53 | ... | 0.00 | 0.04 | 0.0 | 0.05 | 0.02 | 0.0 | 0.0 | 0.01 | 0.00 | 0.0 |
| Campo manejado (GM) | 0.11 | 0.02 | 0.00 | 0.00 | 0.04 | 0.10 | 0.0 | 0.01 | 0.00 | 0.01 | ... | 0.00 | 0.00 | 0.0 | 0.00 | 0.00 | 0.0 | 0.0 | 0.00 | 0.00 | 0.0 |
5 rows × 27 columns
results = []
for p_key, values in df.items():
for key, value in values.items():
results.append({"source": p_key, "target": key, "value": value})
# print(p_key, key, value)
df_list = pd.DataFrame(results, columns=['target', 'source', 'value'])
df_list
| target | source | value | |
|---|---|---|---|
| 0 | Floresta manejada (FM) | Formação Florestal | 4.68 |
| 1 | Floresta não manejada (FNM) | Formação Florestal | 19.35 |
| 2 | Floresta secundária (FSec) | Formação Florestal | 0.44 |
| 3 | Reflorestamento (Ref) | Formação Florestal | 1.35 |
| 4 | Campo manejado (GM) | Formação Florestal | 0.11 |
| ... | ... | ... | ... |
| 643 | Afloramento rochoso manejado (ArM) | Algodão (beta) | 0.00 |
| 644 | Afloramento rochoso não manejado (ArNM) | Algodão (beta) | 0.00 |
| 645 | Mineração (Min) | Algodão (beta) | 0.00 |
| 646 | Solo exposto (SE) | Algodão (beta) | 0.00 |
| 647 | Áreas não observadas (NO) | Algodão (beta) | 0.00 |
648 rows × 3 columns
fig = px.imshow(df.replace(0, None), text_auto=True, aspect="auto", height=1000, title='Matriz de Tabulação Cruzada entre os mapas (Mha)')
fig.show()
fig = make_subplots(
rows=2, cols=1,
shared_yaxes='all',
specs=[[{"type": "xy"}],[{"type": "xy"}]],
subplot_titles=("<b>MapBiomas Col. 7 - mata_atlantica<b>", "<b>Quarto Inventário Nacional - mata_atlantica<b>")
)
fig.add_trace(go.Bar(y= df.sum(), x=df.sum().index, text=((df.sum())).astype(int).astype(str)+"Mha"),
row=1, col=1)
fig.add_trace(go.Bar(y = df.sum(axis='columns').sort_values(ascending=False),
x=df.sum(axis='columns').sort_values(ascending=False).index,
text=((df.sum(axis='columns').sort_values(ascending=False))).astype(int).astype(str)+"Mha"),
row=2, col=1)
fig.update_layout(title_text="<b>Distribuição das Classes por Mapa da Região Estudada<b>",
height=1000,
width=1200,
showlegend=False
)
fig.update_layout(barmode='stack', xaxis={'categoryorder':'total descending'})
fig.show()
equivalencias_linha = equivalencia_linha(df)
display(equivalencias_linha)
| Quarto_Inventario | MapBiomas | Size | |
|---|---|---|---|
| 0 | Floresta manejada (FM) | Formação Florestal | 4.68 |
| 1 | Floresta não manejada (FNM) | Formação Florestal | 19.35 |
| 2 | Floresta secundária (FSec) | Formação Florestal | 0.44 |
| 3 | Reflorestamento (Ref) | Silvicultura | 3.44 |
| 4 | Campo manejado (GM) | Formação Florestal | 0.11 |
| 5 | Campo não manejado (GNM) | Formação Campestre | 1.19 |
| 6 | Campo secundário (GSec) | Formação Florestal | 0.01 |
| 7 | Pastagem (Ap) | Pastagem | 29.87 |
| 8 | Outras formações lenhosas manejadas (OFLM) | Formação Florestal | 0.07 |
| 9 | Outras formações lenhosas não manejadas (OFLNM) | Formação Florestal | 0.09 |
| 10 | Outras formações lenhosas secundárias (OFLSec) | Mosaico de Usos | 0.01 |
| 11 | Agricultura anual (AC) | Soja | 11.75 |
| 12 | Agricultura perene (PER) | Mosaico de Usos | 0.48 |
| 13 | Agricultura semiperene (CANA) | Cana | 4.89 |
| 14 | Água (A) | Rio, Lago e Oceano | 0.53 |
| 15 | Reservatório (Res) | Rio, Lago e Oceano | 1.38 |
| 16 | Assentamento (S) | Área Urbanizada | 1.70 |
| 17 | Dunas manejadas (DnM) | Formação Florestal | 0.00 |
| 18 | Dunas não manejadas (DnNM) | Praia, Duna e Areal | 0.04 |
| 19 | Afloramento rochoso manejado (ArM) | Formação Florestal | 0.00 |
| 20 | Afloramento rochoso não manejado (ArNM) | Formação Florestal | 0.01 |
| 21 | Mineração (Min) | Mineração | 0.03 |
| 22 | Solo exposto (SE) | Formação Florestal | 0.00 |
| 23 | Áreas não observadas (NO) | Formação Florestal | 0.00 |
edge_list,entities,labels,colors,source,target,values,hover_values = df_2_sankey(equivalencias_linha,['MapBiomas', 'Quarto_Inventario'],values='Size')
fig = go.Figure(data=[go.Sankey(
valueformat = ".0f",
node = dict(
pad = 5,
thickness = 20,
line = dict(color = "black", width = 0.5),
label = labels,
color = colors,
customdata=hover_values,
hovertemplate='Source: %{label}<br />'+
'Amount: %{value}<br />'
),
link = dict(
source = source, # indices correspond to labels, eg A1, A2, A2, B1, ...
target = target,
value = values,
customdata=hover_values,
hovertemplate='Source: %{source.label}<br />'+
'Target: %{target.label}<br />'+
'Amount: %{value}<br />',
))])
fig.update_layout(autosize=True,width=900,height=1200,title_text="<b> Quarto_Inventario > MapBiomas | mata_atlantica<b>", font_size=12)
fig.show()
equivalencias_coluna = equivalencia_coluna(df)
display(equivalencias_coluna)
| MapBiomas | Quarto_Inventario | Size | |
|---|---|---|---|
| 0 | Formação Florestal | Floresta não manejada (FNM) | 19.35 |
| 1 | Formação Savânica | Floresta não manejada (FNM) | 1.56 |
| 2 | Mangue | Floresta não manejada (FNM) | 0.13 |
| 3 | Silvicultura | Reflorestamento (Ref) | 3.44 |
| 4 | Campo Alagado e Área Pantanosa | Pastagem (Ap) | 0.55 |
| 5 | Formação Campestre | Campo não manejado (GNM) | 1.19 |
| 6 | Outras Formações não Florestais | Pastagem (Ap) | 0.01 |
| 7 | Pastagem | Pastagem (Ap) | 29.87 |
| 8 | Cana | Agricultura semiperene (CANA) | 4.89 |
| 9 | Mosaico de Usos | Pastagem (Ap) | 9.17 |
| 10 | Praia, Duna e Areal | Dunas não manejadas (DnNM) | 0.04 |
| 11 | Área Urbanizada | Assentamento (S) | 1.70 |
| 12 | Outras Áreas não Vegetadas | Pastagem (Ap) | 0.07 |
| 13 | Afloramento Rochoso | Floresta não manejada (FNM) | 0.18 |
| 14 | Mineração | Mineração (Min) | 0.03 |
| 15 | Aquicultura | Reservatório (Res) | 0.01 |
| 16 | Apicum | Floresta não manejada (FNM) | 0.01 |
| 17 | Rio, Lago e Oceano | Reservatório (Res) | 1.38 |
| 18 | Soja | Agricultura anual (AC) | 11.75 |
| 19 | Arroz (beta) | Agricultura anual (AC) | 0.17 |
| 20 | Outras Lavouras Temporárias | Agricultura anual (AC) | 1.25 |
| 21 | Café | Agricultura perene (PER) | 0.47 |
| 22 | Citrus | Agricultura perene (PER) | 0.07 |
| 23 | Outras Lavouras Perenes | Floresta manejada (FM) | 0.00 |
| 24 | Restinga Arborizada | Floresta não manejada (FNM) | 0.33 |
| 25 | Restinga Herbácea | Pastagem (Ap) | 0.07 |
| 26 | Algodão (beta) | Floresta manejada (FM) | 0.00 |
edge_list,entities,labels,colors,source,target,values,hover_values = df_2_sankey(equivalencias_coluna,['MapBiomas', 'Quarto_Inventario'],values='Size')
fig = go.Figure(data=[go.Sankey(
valueformat = ".0f",
node = dict(
pad = 5,
thickness = 20,
line = dict(color = "black", width = 0.5),
label = labels,
color = colors,
customdata=hover_values,
hovertemplate='Source: %{label}<br />'+
'Amount: %{value}<br />'
),
link = dict(
source = source, # indices correspond to labels, eg A1, A2, A2, B1, ...
target = target,
value = values,
customdata=hover_values,
hovertemplate='Source: %{source.label}<br />'+
'Target: %{target.label}<br />'+
'Amount: %{value}<br />',
))])
fig.update_layout(autosize=True,width=900,height=1200,title_text="<b> MapBiomas > Quarto_Inventario | mata_atlantica<b>", font_size=12)
fig.show()
mapeamento = legenda_harmonizada(equivalencias_linha, equivalencias_coluna)
display(mapeamento)
| Quarto_Inventario | MapBiomas | Size | |
|---|---|---|---|
| 0 | Floresta manejada (FM) | Formação Florestal | 4.68 |
| 1 | Floresta não manejada (FNM) | Formação Florestal | 19.35 |
| 2 | Floresta secundária (FSec) | Formação Florestal | 0.44 |
| 3 | Reflorestamento (Ref) | Silvicultura | 3.44 |
| 4 | Campo manejado (GM) | Formação Florestal | 0.11 |
| 5 | Campo não manejado (GNM) | Formação Campestre | 1.19 |
| 6 | Campo secundário (GSec) | Formação Florestal | 0.01 |
| 7 | Pastagem (Ap) | Pastagem | 29.87 |
| 8 | Outras formações lenhosas manejadas (OFLM) | Formação Florestal | 0.07 |
| 9 | Outras formações lenhosas não manejadas (OFLNM) | Formação Florestal | 0.09 |
| 10 | Outras formações lenhosas secundárias (OFLSec) | Mosaico de Usos | 0.01 |
| 11 | Agricultura anual (AC) | Soja | 11.75 |
| 12 | Agricultura perene (PER) | Mosaico de Usos | 0.48 |
| 13 | Agricultura semiperene (CANA) | Cana | 4.89 |
| 14 | Água (A) | Rio, Lago e Oceano | 0.53 |
| 15 | Reservatório (Res) | Rio, Lago e Oceano | 1.38 |
| 16 | Assentamento (S) | Área Urbanizada | 1.70 |
| 17 | Dunas manejadas (DnM) | Formação Florestal | 0.00 |
| 18 | Dunas não manejadas (DnNM) | Praia, Duna e Areal | 0.04 |
| 19 | Afloramento rochoso manejado (ArM) | Formação Florestal | 0.00 |
| 20 | Afloramento rochoso não manejado (ArNM) | Formação Florestal | 0.01 |
| 21 | Mineração (Min) | Mineração | 0.03 |
| 22 | Solo exposto (SE) | Formação Florestal | 0.00 |
| 23 | Áreas não observadas (NO) | Formação Florestal | 0.00 |
| 24 | Floresta não manejada (FNM) | Formação Savânica | 1.56 |
| 25 | Floresta não manejada (FNM) | Mangue | 0.13 |
| 26 | Pastagem (Ap) | Campo Alagado e Área Pantanosa | 0.55 |
| 27 | Pastagem (Ap) | Outras Formações não Florestais | 0.01 |
| 28 | Pastagem (Ap) | Mosaico de Usos | 9.17 |
| 29 | Pastagem (Ap) | Outras Áreas não Vegetadas | 0.07 |
| 30 | Floresta não manejada (FNM) | Afloramento Rochoso | 0.18 |
| 31 | Reservatório (Res) | Aquicultura | 0.01 |
| 32 | Floresta não manejada (FNM) | Apicum | 0.01 |
| 33 | Agricultura anual (AC) | Arroz (beta) | 0.17 |
| 34 | Agricultura anual (AC) | Outras Lavouras Temporárias | 1.25 |
| 35 | Agricultura perene (PER) | Café | 0.47 |
| 36 | Agricultura perene (PER) | Citrus | 0.07 |
| 37 | Floresta manejada (FM) | Outras Lavouras Perenes | 0.00 |
| 38 | Floresta não manejada (FNM) | Restinga Arborizada | 0.33 |
| 39 | Pastagem (Ap) | Restinga Herbácea | 0.07 |
| 40 | Floresta manejada (FM) | Algodão (beta) | 0.00 |
legendas, source, target, value, node_colors, nodified_x, nodified_y = harmonizacao_2_sankey(df2)
fig = go.Figure(data=[go.Sankey(
arrangement='snap',
node = dict(
pad = 15,
thickness = 20,
line = dict(color = "black", width = 0.5),
label = legendas,
color = node_colors,
x=nodified_x,
y=nodified_y
),
link = dict(
source = source, # indices correspond to labels, eg A1, A2, A1, B1, ...
target = target,
value = value
))])
fig.update_layout(autosize=True,width=1000,height=1500,title_text="<b> Inventário > MapBiomas > Inventário | mata_atlantica <b>", font_size=12)
fig.show()
Aqui temos uma versão do diagrama sem considerar a quantidade de área identificada. Ele possibilita uma visão mais limpa de como ficaram as concordâncias.
legendas, source, target, value, node_colors, nodified_x, nodified_y = harmonizacao_2_sankey(df)
value = [1] * len(value)
fig = go.Figure(data=[go.Sankey(
arrangement='snap',
node = dict(
pad = 15,
thickness = 20,
line = dict(color = "black", width = 0.5),
label = legendas,
color = node_colors,
x=nodified_x,
y=nodified_y
),
link = dict(
source = source, # indices correspond to labels, eg A1, A2, A1, B1, ...
target = target,
value = value
))])
fig.update_layout(autosize=True,width=1000,height=1500,title_text="<b> Quarto Inventário > MapBiomas | mata_atlantica <b>", font_size=12)
fig.show()
concordancia_geral = round(100 * mapeamento.loc[:, "Size"].sum() / df.to_numpy().sum(), 2)
print("A concordância geral entre os mapas foi de {}%".format(concordancia_geral), "considerando a harmonização obtida.")
A concordância geral entre os mapas foi de 77.89% considerando a harmonização obtida.